package models;

import java.util.Calendar;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import net.sf.oval.constraint.ValidateWithMethod;
import play.data.validation.Max;
import play.data.validation.Min;
import play.data.validation.Required;
import play.db.jpa.Model;
import controllers.UsuarioBase;

/**
 * @author santiago
 *
 */

@Entity
public class ManualObjective extends Model {
    
	private static final long serialVersionUID = 7200114222771879994L;

	@ManyToOne
	private Paciente paciente;
	
	@Required(message="crud.help.required")
	private String nombreObjetivoManual;

	@Min(value=0)
	@Max(value=500)
	@Required(message="crud.help.required") 
	private Double pesoActualObjetivoManual;
    
	@Min(value=0)
	@Max(value=500)
	@Required(message="crud.help.required") 
	private Double pesoDeseadoObjetivoManual;
	
    @Temporal(TemporalType.DATE)
    @Required(message="crud.help.required") 
    @ValidateWithMethod(methodName="validarCronologiaFechas", parameterType=Date.class, message="objetivo.fechaMayorActual")
	private Date fechaLimiteObjetivoManual;
    
    private Boolean cumplidoObjetivoManual;
    
	@Temporal(TemporalType.DATE)
	@Required
	private Date fechaInicio;
	
	public ManualObjective() {
		super();
		this.fechaInicio = Calendar.getInstance().getTime();
	}
	
	public boolean validarCronologiaFechas(Date fechaLimite) {
		Date fechaActual = new Date();
		return fechaActual.before(fechaLimite);
	}
	
	/* Redefinición de _save() para que antes de guardarlo le setee una objeto del modelo de dominio
	 * que no puede realizarse antes.
	 * Debido al initial-data se agrega un try para catchear la NullPointerExc que tira SecureSocial.getCurrentUser(),
	 * ya que al levantar la app no hay user logueado, por lo tanto deja que la propiedad en cuestión se configure desde el initial-data.yml
	 * @see play.db.jpa.JPABase#_save()
	 */
	public void _save(){
//		Paciente paciente = null;
//		Long pacienteId = ManualObjectives.useAndDestroyPacienteId();
//		paciente = (Paciente)Usuario.findById(pacienteId);
//		this.setPaciente(paciente);
//		super._save();
		
		// copio de lo de Automatico
		Paciente paciente = null;
		try{
			paciente = UsuarioBase.getPacienteToCreateObjective();
			this.setPaciente(paciente);
			super._save();
		}catch(NullPointerException npe){
			super._save();
		}
	}
    
	public Double getPesoActualObjetivoManual() {
		return pesoActualObjetivoManual;
	}
	public void setPesoActualObjetivoManual(Double pesoActual) {
		this.pesoActualObjetivoManual = pesoActual;
	}
	public Double getPesoDeseadoObjetivoManual() {
		return pesoDeseadoObjetivoManual;
	}
	public void setPesoDeseadoObjetivoManual(Double pesoDeseado) {
		this.pesoDeseadoObjetivoManual = pesoDeseado;
	}
	public Date getFechaLimiteObjetivoManual() {
		return fechaLimiteObjetivoManual;
	}
	public void setFechaLimiteObjetivoManual(Date fechaLimite) {
		this.fechaLimiteObjetivoManual = fechaLimite;
	}
	public Boolean getCumplidoObjetivoManual() {
		return cumplidoObjetivoManual;
	}
	public void setCumplidoObjetivoManual(Boolean cumplido) {
		this.cumplidoObjetivoManual = cumplido;
	}
	public Paciente getPaciente() {
		return paciente;
	}
	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}
	public String getNombreObjetivoManual() {
		return nombreObjetivoManual;
	}
	public void setNombreObjetivoManual(String nombre) {
		this.nombreObjetivoManual = nombre;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}
}
